/****************************************************************************

	COPYRIGHT(C) MAXSI SOFTWARE, JONAS 'SORTIE' TERMANSEN 2008, 2009, 2010

    This file is part of Maxsi Engine.

    Maxsi Engine is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Maxsi Engine is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with Maxsi Engine. If not, see <http://www.gnu.org/licenses/>.

	*/ #include "MaxsiEngineContributors.h" /*

	If you modify this file, please enter your name below and provide contact
	information in MaxsiEngineContributors.h. For more information please see
	MaxsiEngineContributors.h.
	
	Contributors to this file:

	- Jonas 'Sortie' Termansen
	- [your name here]

	MaxsiEngine.dll
	A linkable version of Maxsi Engine

	MaxsiRegression.cpp
	Regressions!

****************************************************************************/

#include <math.h>
#include "MaxsiEngine.h"

namespace MaxsiEngine
{
	bool	LinearRegression(size_t N, double* X, double* Y, double* A, double* B)
	{
		double	SumXiYi		=		0.0;
		double	SumXiXi		=		0.0;
		double	AverageX	=		0.0;
		double	AverageY	=		0.0;

		for (size_t I = 0; I < N; I++)
		{
			SumXiYi			+=		(X[I])*(Y[I]);
			SumXiXi			+=		(X[I])*(X[I]);
			AverageX		+=		X[I];
			AverageY		+=		Y[I];
		}

		AverageX			/=		N;
		AverageY			/=		N;

		*A					=		(SumXiYi-N*AverageX*AverageY)/(SumXiXi-N*AverageX*AverageX);
		*B					=		AverageY - (*A) * AverageX;

		return	true;
	}

	bool	ProportionalRegression(size_t N, double* X, double* Y, double* A)
	{
		double	AverageX	=		0.0;
		double	AverageY	=		0.0;

		for (size_t I = 0; I < N; I++)
		{
			AverageX		+=		X[I];
			AverageY		+=		Y[I];
		}

		//AverageX			/=		N;
		//AverageY			/=		N;

		*A					=		AverageY / AverageX;

		return	true;
	}

	double	Correlation(size_t N, double* X, double* Y)
	{
		double	AverageX	=		0.0;
		double	AverageY	=		0.0;

		for (size_t I = 0; I < N; I++)
		{
			AverageX		+=		X[I];
			AverageY		+=		Y[I];
		}

		AverageX			/=		N;
		AverageY			/=		N;

		double	Upper		=		0.0;
		double	Lower1		=		0.0;
		double	Lower2		=		0.0;

		for (size_t I = 0; I < N; I++)
		{
			Upper			+=		(X[I]-AverageX)*(Y[I]-AverageY);
			Lower1			+=		(X[I]-AverageX)*(X[I]-AverageX);
			Lower2			+=		(Y[I]-AverageY)*(Y[I]-AverageY);
		}

		Lower1				=		sqrt(Lower1);
		Lower2				=		sqrt(Lower2);

		return	Upper/(Lower1*Lower2);
	}
}
